package com.twl.app.base.ctrl;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import oracle.sql.DATE;

import org.apache.log4j.Logger;
import org.junit.experimental.theories.DataPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.twl.app.base.bo.BfBoImpl;
import com.twl.app.base.bo.CommonBoImpl;
import com.twl.app.base.entity.Bfsalary;
import com.twl.app.base.entity.Checktemplet;
import com.twl.app.base.entity.Jbsalary;
import com.twl.app.base.entity.Jsbfmoney;
import com.twl.app.base.entity.Leavebmoney;
import com.twl.app.base.entity.Uemp;
import com.twl.app.base.util.BigdecUitl;
import com.twl.app.base.util.DateComm;
import com.twl.core.framework.ctrl.AbsCrudCtrl;

@Transactional
@Service("bfCtrlImpl")
public class BfCtrlImpl extends AbsCrudCtrl<BfBoImpl> {

	private Logger logger = Logger.getLogger(BfCtrlImpl.class);

	@Autowired
	private BigdecUitl bigdecUitl;
	@Autowired
	private CommonCtrlImpl commonCtrlImpl;
	@Autowired
	private DateComm dateComm;

	/**
	 * 新员工补发（扣减） 插入信息
	 * 
	 * @param bfsalary
	 * @return
	 * @throws Exception
	 */
	public String insertBf(Checktemplet checktemplet,Uemp uemp) throws Exception {

		try {
			Bfsalary bfsalary = new Bfsalary();
		/*	Uemp uemp = commonCtrlImpl.getUemp(checktemplet.getStaffint());
			if (uemp == null) {
				return "no user";
			}*/
			if(0==uemp.getUmpstaff()){
			//if (new Integer(0).equals(uemp.getUmpstaff())) {// 新入职员工
				String stafftype = uemp.getStafftype();// 员工类型 0 正式、 1 派遣员工
				String staffmoney = uemp.getMoneycount(); // 基本工资
				Integer outforworkint = commonCtrlImpl
						.getOutforworkint(checktemplet.getPeriod());// 应出勤
				Integer realityint = commonCtrlImpl.getOutforworkintRZ(uemp
						.getStaffint());// 实际出勤

				bfsalary.setStaffint(uemp.getStaffint());

				bfsalary.setStafftype(stafftype);
				bfsalary.setStafftypes(uemp.getStafftypes());
				bfsalary.setOutforworkint(outforworkint);
				bfsalary.setRealityint(realityint.doubleValue());
				bfsalary.setStaffmoney(staffmoney);
				bfsalary.setDatemoney(dateComm.getDateMoney(uemp, checktemplet));

				if ("0".equals(stafftype)) {// 正式员工补发(工资基数/上月应出勤工作日×上月实际出勤工作日)
					BigDecimal amountdou = BigdecUitl.mul(
							BigdecUitl.div(
									new BigDecimal(staffmoney).doubleValue(),
									outforworkint.doubleValue(),10)
									.doubleValue(), realityint);
					bfsalary.setAmountdou(bigdecUitl
							.formatBigDecimal(amountdou));

				} else {// 派遣员工扣减(工资基数/上月应出勤工作日×(上月应出勤工作日 – 上月实际出勤工作日)
					BigDecimal amountdou = BigdecUitl.mul(
							BigdecUitl.div(
									new BigDecimal(staffmoney).doubleValue(),
									outforworkint.doubleValue(),10)
									.doubleValue(),
							BigdecUitl.sub(outforworkint.doubleValue(),
									realityint).doubleValue());
					BigDecimal amountNew = new BigDecimal(0).subtract(amountdou);//正负号转换
					bfsalary.setAmountdou(bigdecUitl
							.formatBigDecimal(amountNew));
				}
				/*uemp.setUmpstaff(1);
				String result = bo.updateUempByBf(uemp);*/
				return bo.insetBf(bfsalary);
			}

		} catch (Exception e) {
			throw e;
		}
		return "not be new staff";
	}

	/**
	 * 正式员工晋升或者派遣晋升补发 插入
	 * 
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("static-access")
	public String insertJsbf(Checktemplet checktemplet,Uemp uemp) throws Exception {
		try {
			Jsbfmoney jsbfmoney = new Jsbfmoney();
			/*Uemp uemp = commonCtrlImpl.getUemp(checktemplet.getStaffint());
			if (uemp == null) {
				return "no user";
			}*/
			if (new Integer(1).equals(uemp.getPromedeint())) {// 是否晋升
				String stafftype = uemp.getStafftype();// 员工类型 0 正式、 1 派遣员工
				String moneyNow = uemp.getMoneycount(); // 晋升后基本工资
				String moneyBefore = commonCtrlImpl.findjbsalarying(
						checktemplet.getStaffint()).getStaffmoney(); // 晋升前的基本工资

				Integer outwork = commonCtrlImpl.getOutforworkint(uemp
						.getDatepromed().substring(0, 6));// 查询日历表晋升这个月的应出勤
				Integer outworkJS = commonCtrlImpl.getOutforworkintJS(uemp
						.getStaffint());// 晋升这个月的实际出勤

				jsbfmoney.setStaffint(checktemplet.getStaffint());
				jsbfmoney.setStafftype(uemp.getStafftype());
				jsbfmoney.setStafftypes(uemp.getStafftypes());
				jsbfmoney.setOutforworkint(outwork);
				jsbfmoney.setStaffpromote(moneyBefore);
				jsbfmoney.setPbackdou(moneyNow);
				jsbfmoney.setDatemoney(dateComm.getDateMoney(uemp, checktemplet));
				//FIXME
				Integer monthCount = dateComm.getMonth(// 判断晋升日期截止当前日期有个月
						dateComm.dateFormatToStr(dateComm.getRealDate(checktemplet.getPeriod())),
						dateComm.getFormatStr(uemp.getDatepromed()));
				BigDecimal realMoneyMonth = bigdecUitl.sub(new BigDecimal(// 晋升工资差
						moneyNow).doubleValue(),
						new BigDecimal(moneyBefore).doubleValue());

				if (("0").equals(uemp.getStafftype())) {// 正式员工
					/*
					 * 调薪后实际出勤数（指晋升日到当前考勤月的总出勤数） Integer outworkReal =
					 * commonCtrlImpl.getfindday( uemp.getDatepromed(), new
					 * SimpleDateFormat("yyyyMMdd").format(new Date()));
					 * jsbfmoney.setPbackint(outworkReal.doubleValue());
					 */
					BigDecimal amount = bigdecUitl.mul(
							bigdecUitl.div(realMoneyMonth.doubleValue(),
									outwork.doubleValue(),10).doubleValue(),
							outworkJS.doubleValue());
					if (monthCount > 1) {
						amount = bigdecUitl.add(
								amount.doubleValue(),
								bigdecUitl.mul(realMoneyMonth.doubleValue(),
										 Double.valueOf(monthCount - 1))
										.doubleValue());
					}
					jsbfmoney.setAmountdou(bigdecUitl.formatBigDecimal(amount));
				} else if (("1").equals(uemp.getStafftype())) { // 派遣员工
					if (monthCount == 1) {// 上月晋升扣减
						// 调薪月调薪前出勤数
						Integer outworkbefore = outwork - outworkJS;
						jsbfmoney.setPromoteint(outworkbefore.doubleValue());

						// 扣减
						BigDecimal amount = bigdecUitl
								.mul(bigdecUitl.div(
										realMoneyMonth.doubleValue(),
										outwork.doubleValue(),10).doubleValue(),
										outworkbefore.doubleValue());
						
						BigDecimal amountNew = new BigDecimal(0).subtract(amount);//正负号转换

						jsbfmoney.setAmountdou(bigdecUitl
								.formatBigDecimal(amountNew));
					} else {// 隔月补发
						
						BigDecimal amount = bigdecUitl.mul(
								bigdecUitl.div(realMoneyMonth.doubleValue(),
										outwork.doubleValue(),10).doubleValue(),
								outworkJS.doubleValue());
						if (monthCount > 2) {
							amount = bigdecUitl.add(
									amount.doubleValue(),
									bigdecUitl.mul(realMoneyMonth.doubleValue(),
											 Double.valueOf(monthCount - 2))
											.doubleValue());
						}
						jsbfmoney.setAmountdou(bigdecUitl
								.formatBigDecimal(amount));

					}
				}
				// 修改员工信息把晋升日期改null和晋升表识改0
			/*	uemp.setPromedeint(0);
				uemp.setDatepromed(null);
				String result = bo.updateUempByBf(uemp);*/
				return bo.insertJsbf(jsbfmoney);
			}
		} catch (Exception e) {

			throw e;
		}

		return "no promotion";// 没有晋升

	}

}
